首页 > 试题广场 >

二叉搜索树的最近公共祖先

[编程题]二叉搜索树的最近公共祖先
  • 热度指数:80257 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.
2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值
3.所有节点的值都是唯一的。
4.p、q 为不同节点且均存在于给定的二叉搜索树中。
数据范围:
3<=节点总数<=10000
0<=节点值<=10000

如果给定以下搜索二叉树: {7,1,12,0,4,11,14,#,#,3,5},如下图:


示例1

输入

{7,1,12,0,4,11,14,#,#,3,5},1,12

输出

7

说明

节点1 和 节点12的最近公共祖先是7   
示例2

输入

{7,1,12,0,4,11,14,#,#,3,5},12,11

输出

12

说明

因为一个节点也可以是它自己的祖先.所以输出12   

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
function lowestCommonAncestor( root ,  p ,  q ) {
    if(!root) return -1;
    if(q < p) [p,q] = [q,p];
    if(root.val >= p && root.val <= q){
        return root.val;
    } else if(root.val < p){
        return lowestCommonAncestor(root.right,p,q);
    } else if(root.val > q){
        return lowestCommonAncestor(root.left,p,q);
    }
}

发表于 2023-09-01 12:18:52 回复(0)
function lowestCommonAncestor( root ,  p ,  q ) {
    if(!root) return
    if((p < root.val && q> root.val) || (p >root.val && q< root.val) ||(root.val === p) || (root.val === q)){
        return root.val
    }
    else if(p < root.val && q < root.val){
        return lowestCommonAncestor(root.left,p,q)
    }else if(p > root.val && q > root.val){
        return lowestCommonAncestor(root.right,p,q)
    }
}

发表于 2022-11-11 19:46:47 回复(0)
/*
 * function TreeNode(x) {
 *   this.val = x;
 *   this.left = null;
 *   this.right = null;
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param root TreeNode类
 * @param p int整型
 * @param q int整型
 * @return int整型
 */
let resultRoot = null;
function lowestCommonAncestor(root, p, q) {
  if (!root) {
    return root;
  }
  resultRoot = null;
  getResult(root, p, q);
  return resultRoot;
}
function getResult(root, p, q) {
  let list = [false, false];
  if (!root.left && !root.right) {
    root.val == p && (list[0] = true);
    root.val == q && (list[1] = true);
    return list;
  }
  let left = [false, false];
  let right = [false, false];
  if (root.left) {
    left = getResult(root.left, p, q);
  }
  if (root.right) {
    right = getResult(root.right, p, q);
  }
  list[0] = left[0] || right[0];
  list[1] = left[1] || right[1];
  root.val == p && (list[0] = true);
  root.val == q && (list[1] = true);
  if (list[0] && list[1]) {
    resultRoot = root.val;
    return [false, false];
  }
  return list;
}
module.exports = {
  lowestCommonAncestor: lowestCommonAncestor,
};
需要注意的地方:返回的结不是一个节点,而是这个节点的值。p, q并不是值节点,而是值该节点的值
发表于 2022-05-10 21:20:01 回复(0)
function lowestCommonAncestor( root ,  p ,  q ) {
    // write code here
    if (root === null) return null;
    let min = Math.min(p,q);
    let max = Math.max(p,q);
    if (root.val === min || root.val === max) return root.val // 有一个是根节点
    if (min < root.val && max > root.val) return root.val    // 一左一右
    if (root.val > min && root.val > max) { // 都在左树
        return lowestCommonAncestor(root.left, p,q);
    }
    if (root.val <min && root.val <max ) {  // 都在右树
        return lowestCommonAncestor(root.right, p,q);
    }
}
发表于 2021-12-07 09:49:24 回复(0)